#include "../hle.h"

#define VOLATILEMEMSTART 0x08400000
#define VOLATILEMEMEND   0x08800000
#define VOLATILEMEMSIZE  VOLATILEMEMEND - VOLATILEMEMSTART

u8 volatileMemAllocated = 0;

void sceKernelVolatileMemTryLock()
{
    if (volatileMemAllocated) {
        _log(INF, HLE, "-1 = sceKernelVolatileMemTryLock(unk = %08x, ptr = %08x, size = %08x)", PARAM(0), PARAM(1), PARAM(2));
        RETURN(-1);
    }
    else
    {
        u32 memStart, memSize;
        MemRegionInfo volatileRegion = {"Volatile Memory", MRTYPE_MEMORY, VOLATILEMEMSTART, VOLATILEMEMEND, NULL, NULL, NULL};
        memStart = memSize = 0;
        if (mem_isOk(PARAM(1))) {
            memStart = VOLATILEMEMSTART;
            mem_write32(PARAM(1), memStart);
        }
        if (mem_isOk(PARAM(2))) {
            memSize = VOLATILEMEMSIZE;
            mem_write32(PARAM(2), memSize);
        }

        memMap_addRegion(volatileRegion);
        volatileMemAllocated = 1;

        _log(INF, HLE, "0 = sceKernelVolatileMemTryLock(unk = %08x, ptr = %08x [%08x], size = %08x [%08x])", PARAM(0), PARAM(1), memStart, PARAM(2), memSize);
        RETURN(0);
    }
}

void sceKernelVolatileMemLock()
{
    if (volatileMemAllocated)
        _log(INF, HLE, "0 = sceKernelVolatileMemLock(unk = %08x, ptr = %08x, size = %08x) [already allocated]", PARAM(0), PARAM(1), PARAM(2));
    else
    {
        u32 memStart, memSize;
        MemRegionInfo volatileRegion = {"Volatile Memory", MRTYPE_MEMORY, VOLATILEMEMSTART, VOLATILEMEMEND, NULL, NULL, NULL};
        memStart = memSize = 0;
        if (mem_isOk(PARAM(1))) {
            memStart = VOLATILEMEMSTART;
            mem_write32(PARAM(1), memStart);
        }
        if (mem_isOk(PARAM(2))) {
            memSize = VOLATILEMEMSIZE;
            mem_write32(PARAM(2), memSize);
        }

        memMap_addRegion(volatileRegion);
        volatileMemAllocated = 1;

        _log(INF, HLE, "0 = sceKernelVolatileMemLock(unk = %08x, ptr = %08x [%08x], size = %08x [%08x])", PARAM(0), PARAM(1), memStart, PARAM(2), memSize);
    }
    RETURN(0);
}

void sceKernelVolatileMemUnlock()
{
    if (volatileMemAllocated)
    {
        _log(INF, HLE, "0 = sceKernelVolatileMemUnlock(unk = %08x)", PARAM(0));

        memMap_delRegion(VOLATILEMEMSTART);
        volatileMemAllocated = 0;

        RETURN(0);
    }
    else {
        _log(INF, HLE, "-1 = sceKernelVolatileMemUnlock(unk = %08x)", PARAM(0));
        RETURN(-1);
    }
}

void sceKernelPowerLock()
{
    _log(WRN, HLE, "sceKernelPowerLock()");
    RETURN(0);
}

void sceKernelPowerUnlock()
{
    _log(WRN, HLE, "sceKernelPowerUnlock()");
    RETURN(0);
}

void sceKernelPowerTick()
{
    _log(WRN, HLE, "sceKernelPowerTick()");
    RETURN(0);
}

